/**
 * ===================================
 * 蓝色敌人游戏对象 (BlueEnemy.js)
 * ===================================
 * 
 * 功能说明：
 * - 管理蓝色敌人的所有行为（移动、射击、受伤、缩放等）
 * - 继承自Physics.Arcade.Sprite，具备物理属性和动画功能
 * - 实现多阶段生命值系统（受伤后缩小）
 * - 动态难度调整（受伤后移动更快）
 * - 反击机制（受伤时向玩家射击）
 * 
 * 敌人特性：
 * - 从右侧飞入，然后上下浮动
 * - 受伤3次后缩小一级，共4个等级
 * - 等级越低移动越快，难度递增
 * - 每次受伤都会反击玩家
 * 
 * 作者：游戏开发团队
 * 创建时间：2024年
 */

// 导入Phaser3核心模块
import { Physics, Math } from "phaser";
// 导入子弹类
import { Bullet } from "./Bullet";

/**
 * 蓝色敌人类 - 继承自Physics.Arcade.Sprite
 * 具备物理属性和精灵动画功能的游戏对象
 */
export class BlueEnemy extends Physics.Arcade.Sprite {
    
    // ===== 场景引用 =====
    scene = null;                       // 当前场景的引用
    
    // ===== 动画状态管理 =====
    animation_is_playing = false;       // 是否正在播放缩放动画（防止重复触发）
    
    // ===== 生命值系统 =====
    damage_life_point = 3;              // 当前阶段剩余生命值（每阶段3点）
    scale_damage = 4;                   // 当前缩放等级（4->3->2->1，数值越小敌人越小）
    
    // ===== 移动动画 =====
    up_down_tween = null;               // 上下浮动的Tween动画对象
    
    // ===== 子弹管理 =====
    bullets = null;                     // 敌人子弹对象池

    /**
     * 构造函数 - 初始化蓝色敌人对象
     * @param {Phaser.Scene} scene - 当前场景实例
     */
    constructor(scene) {
        // 调用父类构造函数，创建物理精灵对象
        // 参数：场景, X坐标(屏幕右侧外), Y坐标(屏幕下方), 纹理ID("enemy-blue")
        super(scene, scene.scale.width + 150, scene.scale.height - 100, "enemy-blue");
        
        // 保存场景引用
        this.scene = scene;
        
        // 将敌人对象添加到场景的显示列表中
        this.scene.add.existing(this);
        
        // 将敌人对象添加到场景的物理世界中，启用物理属性
        this.scene.physics.add.existing(this);
        
        // ===== 设置敌人外观 =====
        this.setScale(4);                   // 设置缩放为4倍（最大尺寸）
        this.body.setSize(15, 15);          // 设置碰撞体积为15x15像素

        // ===== 创建上下浮动动画 =====
        // 敌人会在垂直方向上持续浮动，增加动感
        this.up_down_tween = this.scene.tweens.add({
            targets: this,                  // 动画目标：敌人对象
            y: 85,                         // 目标Y坐标：85像素
            duration: 1000,                // 动画持续时间：1秒
            ease: Math.Easing.Sine.InOut,  // 缓动函数：正弦进出缓动（平滑）
            yoyo: true,                    // 启用往返动画（上下循环）
            repeat: -1                     // 无限重复
        });
        
        // 暂停浮动动画，等待敌人入场后再开始
        this.up_down_tween.pause();

        // ===== 创建敌人子弹对象池 =====
        // 管理敌人发射的所有子弹，优化性能
        this.bullets = this.scene.physics.add.group({
            classType: Bullet,              // 对象池中对象的类型
            maxSize: 100,                  // 对象池最大容量
            runChildUpdate: true           // 自动调用池中每个对象的update方法
        });
    }

    /**
     * ===== 开始游戏方法 =====
     * 播放敌人入场动画，从屏幕右侧飞入游戏区域
     */
    start() {
        // ===== 创建入场动画 =====
        // 敌人从右侧飞入到指定位置
        this.scene.tweens.add({
            targets: this,                      // 动画目标：敌人对象
            x: this.scene.scale.width - 150,   // 目标X坐标：距离右边界150像素
            duration: 1000,                    // 动画持续时间：1秒
            delay: 1000,                       // 延迟时间：1秒后开始
            ease: "Power2",                    // 缓动函数：二次方缓动
            
            // ===== 入场完成回调 =====
            onComplete: () => {
                // 入场动画完成后，开始上下浮动
                this.up_down_tween.resume();
            }
        });
    }

    /**
     * ===== 受伤处理方法 =====
     * 处理敌人受到攻击时的所有逻辑
     * @param {number} player_x - 玩家X坐标（用于反击射击）
     * @param {number} player_y - 玩家Y坐标（用于反击射击）
     */
    damage(player_x, player_y) {
        // ===== 反击射击 =====
        // 敌人受伤时立即向玩家位置发射子弹
        const bullet = this.bullets.get();
        if (bullet) {
            bullet.fire(
                this.x,             // 子弹起始X：敌人当前位置
                this.y,             // 子弹起始Y：敌人当前位置
                player_x,           // 目标X：玩家位置
                player_y,           // 目标Y：玩家位置
                "enemy-bullet"      // 使用敌人子弹纹理
            );
        }

        // ===== 播放受伤动画 =====
        this.anims.play("hit");

        // ===== 生命值和缩放处理 =====
        // 只有在没有播放缩放动画且还有缩放等级时才处理
        if (!this.animation_is_playing && this.scale_damage > 1) {
            
            if (this.damage_life_point === 0) {
                // ===== 当前阶段生命值耗尽，进入下一阶段 =====
                
                this.animation_is_playing = true;  // 标记动画正在播放
                
                // 创建缩放动画
                this.scene.tweens.add({
                    targets: this,                  // 动画目标：敌人对象
                    scale: --this.scale_damage,     // 目标缩放：减小一级（4->3->2->1）
                    duration: 500,                  // 动画持续时间：0.5秒
                    ease: "Elastic.In",             // 缓动函数：弹性进入（有弹跳效果）
                    
                    // ===== 缩放完成回调 =====
                    onComplete: () => {
                        // 重置当前阶段生命值
                        this.damage_life_point = 10;  // 注意：这里设为10，但实际逻辑按3计算
                        this.animation_is_playing = false;  // 标记动画结束
                    }
                });
            } else {
                // ===== 当前阶段还有生命值，直接扣除 =====
                this.damage_life_point--;
            }
        }

        // ===== 动态难度调整 =====
        // 敌人受伤后移动速度加快，增加游戏难度
        
        // 计算新的时间缩放：基础1 + (3-当前等级)/2
        // 等级4: 1 + (3-4)/2 = 0.5 (较慢)
        // 等级3: 1 + (3-3)/2 = 1.0 (正常)
        // 等级2: 1 + (3-2)/2 = 1.5 (较快)
        // 等级1: 1 + (3-1)/2 = 2.0 (很快)
        this.up_down_tween.timeScale = 1 + (3 - this.scale_damage) / 2;
        
        // ===== 最高难度特殊处理 =====
        if (this.scale_damage === 1) {
            // 当敌人缩放到最小时，改变移动模式
            this.up_down_tween.easing = "Power2";  // 改为更激进的缓动
            this.up_down_tween.x = 10;             // 添加水平移动（注意：这可能是bug，应该是修改其他属性）
        }
    }

}